import random
import re
from django.contrib.auth import login
from django.shortcuts import render
from django.views import View
from django_redis import get_redis_connection
from libs.captcha.captcha import captcha
from django.http import HttpResponse, HttpResponseBadRequest, JsonResponse

from libs.yuntongxun.sms import CCP


class ImageView(View):
    def get(self,request, uuid):
        # 生成图片验证码
        text, image = captcha.generate_captcha()

        # 链接redis数据库
        # 保存图片验证码
        redis_conn = get_redis_connection('code')
        # redis操作:
            # setex key seconds value
            # redis_conn.setex(key,seconds,value)
            # redis_conn.setex(uuid,120,text)
        redis_conn.setex('uuid_%s' %uuid, 300, text)

        # 响应图片验证码
        return HttpResponse(image, content_type='image/jpeg')



class SmsView(View):
    """
    用户:输入手机号及图片验证码等信息后点击发送短信按钮
    前端:收集用户输入的手机号和图片验证码并验证是否符合格式,然后发送给后端
    后端:接受前端数据然后验证是否符合格式
        链接redis查询图片验证码的uuid并进行对比(转换全部小写或大写)
        生成短信并保存后发送
        返回响应
    """
    def get(self,request, mobile):
        # 获取数据
        image_code = request.GET.get('image_code')
        uuid = request.GET.get('image_code_id')
        # 验证是否存在
        if not all([image_code, uuid]):
            return HttpResponseBadRequest('参数不全')
        # 验证手机号是否正确
        if not re.match(r'1[3-9]\d{9}', mobile):
            return HttpResponseBadRequest('手机号不正确')

        # 链接数据库的对象
        redis_conn = get_redis_connection('code')

        # 查询对比redis的uuid
        redis_uuid = redis_conn.get('uuid_%s' % uuid)
        # 如果uuid过期或不存在
        if redis_uuid is None:
            return HttpResponseBadRequest('图片验证码过期')
        # 进行对比
        if image_code.lower() != redis_uuid.decode().lower():
            return HttpResponseBadRequest('图片验证码不正确')

        # 生成短信
        sms_code = '%06d' % random.randint(0,999999)

        # 保存短信
        redis_conn.setex('sms_%s' % sms_code,300,sms_code)

        # 发送短信
        # 免费开发测试使用的模板ID为1，形式为：
        # 【云通讯】您使用的是云通讯短信模板，您的验证码是{1}，请于{2}分钟内正确输入。
        # 其中{1}和{2}为短信模板的参数
        # 因为是顺序同步执行,所以需要变成异步使得点击短信验证码按钮后直接变为60s等待时间
        CCP().send_template_sms(mobile,[sms_code,5],1)

        # 返回响应
        return JsonResponse({'msg':'ok', 'code':'0'})